package lib.bone.system.domain.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lib.bone.common.converter.JpaListStringConverter;
import lombok.*;
import org.hibernate.Hibernate;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Set;

/**
 * @Author : Kindear
 * @Date : 2021-11-15
 * @Desc : 用户角色实体对象
 */
@Getter
@Setter
@RequiredArgsConstructor
@Entity
@Table(name = "sys_role")
@ApiModel(value = "用户角色实体",description = "用户角色信息管理")
@EntityListeners(AuditingEntityListener.class)
public class SysRole {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @ApiModelProperty(value = "角色ID",name = "id")
    Long id;

    /** 角色名称 **/
    @ApiModelProperty("角色名称")
    @Column(name = "role_name")
    String roleName;

    @ApiModelProperty("角色标识")
    @Column(name = "role_key")
    String roleKey;

    /** 角色描述 **/
    @ApiModelProperty("角色描述")
    @Column(name = "role_description")
    String roleDescription;

    /** 角色权限列表 **/
    @ApiModelProperty("角色权限")
    @Column(name = "role_permission",length = 2048)
    @Convert(converter = JpaListStringConverter.class)
    List<String> permission;

    /** 角色排序 **/
    @ApiModelProperty("角色排序")
    @Column(name = "role_sort")
    Integer roleSort;

    /** 角色人员 **/
    @JsonIgnoreProperties(value = "roles")
    @ManyToMany(cascade = CascadeType.REFRESH,mappedBy = "roles",fetch = FetchType.LAZY)
    Set<SysUser> users;

    /** 数据范围（1：所有数据权限；2：自定义数据权限；3：本部门数据权限；4：本部门及以下数据权限） */
    @ApiModelProperty("数据范围")
    @Column(name = "data_scope")
    Integer dataScope;

    /** 菜单树选择项是否关联显示（ 0：父子不互相关联显示 1：父子互相关联显示） */
//    @ApiModelProperty("菜单树关联")
//    @Column(name = "menu_check_strictly")
//    private Boolean menuCheckStrictly;
//
//    /** 部门树选择项是否关联显示（0：父子不互相关联显示 1：父子互相关联显示 ） */
//    @ApiModelProperty("部门树关联")
//    @Column(name = "dept_check_strictly")
//    private Boolean deptCheckStrictly;
    /**
     * 角色状态 可选 0 禁用 1 正常
     */
    @ApiModelProperty("角色状态")
    @Column(name = "status",nullable = false)
    private Integer status;

    @CreatedDate
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @ApiModelProperty(value = "记录创建时间",name = "createdTime")
    @Column(name = "created_time")
    private Date createdTime;
    @LastModifiedDate
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @ApiModelProperty(value = "记录更新时间",name = "updatedTime")
    @Column(name = "updated_time")
    private Date updatedTime;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
        SysRole sysRole = (SysRole) o;
        return id != null && Objects.equals(id, sysRole.id);
    }

    @Override
    public int hashCode() {
        return getClass().hashCode();
    }
}
